#ifndef DATOSTEXTOS_H_
#define DATOSTEXTOS_H_

#include "../Dato.h"
#include "../funciones.h"
#include "../Clave.h"

namespace Toolkit
{

class DatoTexto: public Dato
{
public:

	DatoTexto(const string &elTexto = "", const int &unNum = 0)
	{
		this->texto = elTexto;
		this->id = unNum;
	}

	virtual ~DatoTexto()
	{
	}

	virtual void serializar(stringstream& stream) const
	{
		serializacionDigito(stream, BINARIO, id);
		serializacionDigito(stream, BINARIO, texto.size());
		stream.write(texto.c_str(), texto.size());

	}

	virtual void hidratar(stringstream& stream)
	{
		hidratacionDigito(stream, BINARIO, id);

		unsigned long int tamano = 0;
		hidratacionDigito(stream, BINARIO, tamano);

		char *buffer = new char[tamano];
		stream.read(buffer, tamano);
		texto = string().append(buffer, tamano);

		delete[] buffer;
	}

	Dato* clonar() const
	{
		return new DatoTexto(texto, id);
	}

	int getNum() const
	{
		return id;
	}

	string getTexto()
	{
		return texto;
	}
private:
	string texto;
	int id;

};

class ClaveDatoTexto: public Clave
{
public:
	ClaveDatoTexto(const DatoTexto &dato)
	{
		this->num = dato.getNum();
	}

	ClaveDatoTexto(int num)
	{
		this->num = num;
	}

	virtual ~ClaveDatoTexto()
	{

	}

	virtual void serializar(stringstream &stream) const
	{
		serializacionDigito(stream, BINARIO, num);
	}

	virtual void hidratar(stringstream & stream)
	{
		hidratacionDigito(stream, BINARIO, num);
	}

	virtual bool operator ==(const Clave& clave) const
	{
		return this->num == ((ClaveDatoTexto &) clave).num;
	}

	virtual bool operator ==(const Dato& dato) const
	{
		return this->num == ((DatoTexto &) dato).getNum();
	}

	virtual bool operator <(const Clave &) const
	{
		return true;
	}
	virtual bool operator <(const Dato &) const
	{
		return false;
	}

	int getNum() const
	{
		return num;
	}

	/**
	 * Devuelve una nueva instancia de la clave, con igual contenido.
	 * La memoria es responsabilidad del que llama el método.
	 * */
	virtual Clave* clonar() const
	{
		return new ClaveDatoTexto(this->num);
	}

	virtual Clave* crearDesdeDato(const Dato &dato) const
	{
		return new ClaveDatoTexto((DatoTexto &) dato);
	}

private:
	int num;

};

}

#endif /* DATOSTEXTOS_H_ */
